class Father {

    // 默认是public
    name: string

    constructor(name: string) {
        this.name = name
    }

    // 默认是public
    hit() {
        console.log(this, ":", "下雨天打孩子，闲着也是闲着");
    }
}

const f1 = new Father("杰克")
f1.name
f1.hit()

/* private 私有属性/方法 只有class内部能访问 */
// class Father2 {

//     public name: string
//     private money: number

//     constructor(name: string) {
//         this.name = name

//         // 类的内部可以访问私有属性
//         this.money = 0.5
//     }

//     /* 私有属性可以通过getter有条件地供外界访问 */
//     getMoney() {
//         if (Math.random() > 0.5) {
//             return this.money
//         } else {
//             return NaN
//         }
//     }

//     // 默认是public
//     public hit() {
//         console.log(this, ":", "下雨天打孩子，闲着也是闲着");
//     }

//     private quqian(jine: number) {
//         this.money -= jine
//     }

//     public mimaquqian(jine: number, mima: string) {
//         if (mima === "123456") {
//             this.quqian(jine)
//         } else {
//             throw new Error("密码输入错误, please fuck off!")
//         }
//     }

// }

// const f2 = new Father2("杰克")
// f2.name

// // 类外部无法访问私有成员
// f2.money

// f2.hit()
// f2.quqian(1000000)

// try {
//     f2.mimaquqian(10000000, "123456")
// } catch (error) {
//     console.log(error);
// }




/* protected 受保护成员（属性+方法） 子类也可以访问 */
class Father3 {

    protected name: string

    constructor(name: string) {
        this.name = name
    }

    protected hit() {
        console.log(this, ":", "下雨天打孩子，闲着也是闲着");
    }
}

const f3 = new Father3("杰克")
f3.name
f3.hit()

class Son extends Father3 {
    constructor(name: string) {
        super(name)

        // 子类中可以访问父类中的【受保护属性】
        console.log(this.name);

        // 子类中可以访问父类中的【受保护方法】
        this.hit()
    }
}




/* 静态成员 */
class Person {
    static wuzhongMingzi = "人类"
    static die() {
        console.log("眼一闭腿一蹬:Goodbye,World!");
    }
}

console.log(Person.die());
console.log(new Person().die());

console.log(Person.wuzhongMingzi);
console.log(new Person().wuzhongMingzi);




/* 抽象类 */
abstract class Animal {
    abstract makeSound(): void;
    move(): void {
        console.log('roaming the earch...');
    }
}

class Cat extends Animal {

    // 实现父类抽象方法
    makeSound(): void {
        console.log("miao miao");
    }

    catchMouse() {
        console.log(this, "正在捕鼠");
    }
}

/* 也可以不实现抽象父类中的抽象方法 此时子类自己也是抽象类 */
abstract class Beast extends Animal {
    hunt() {
        console.log(this, "正在捕猎");
    }
}

class Tiger extends Beast {
    makeSound(): void {
        throw new Error("Method not implemented.");
    }
}

const t1 = new Tiger()
t1.hunt()//继承于Beast父类
t1.makeSound()//自行实现的父类抽象方法
t1.move()//继承于爷爷类Animal
